package com.bear.newsset.widget;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;

import androidx.appcompat.widget.AppCompatEditText;

import com.bear.newsset.R;
import com.bear.newsset.util.SysUtil;
import com.bear.newsset.util.Utils;

import java.util.Timer;
import java.util.TimerTask;

/**
 * 搜索栏
 */
public class SearchView extends AppCompatEditText
        implements View.OnClickListener, View.OnKeyListener {
    private boolean isEnable;
    private OnClickListener mOnClickListener, mOnEnterListener;
    public SearchView(Context context) {
        super(context);
        init();
    }

    public SearchView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SearchView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = Utils.dp2Px(getContext(), 36);
        setMeasuredDimension( MeasureSpec.getSize( widthMeasureSpec ), height );
    }

    private void init() {
        initView();
        setClickable( true );
        //默认禁用搜索
        setEnabledSearch( false );
        //键盘监听
        setOnKeyListener( this );
    }

    private void initView() {
        Resources res = getResources();
        int colorBlack = res.getColor(R.color.colorBlack);
        Drawable drawSearchBG = res.getDrawable(R.drawable.shape_bg_search);

        setHint("搜一下");
        setTextColor( colorBlack );
        setTextSize( 15 );
        setInputType(InputType.TYPE_CLASS_TEXT);
        setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_search, 0, 0, 0);
        setBackgroundDrawable( drawSearchBG );
        setGravity( Gravity.CENTER_VERTICAL );
        //回车键改为搜索
        setImeOptions( EditorInfo.IME_ACTION_SEARCH );
    }

    /**
     * 是否启用搜索
     * @param enabled   是否启用
     */
    public void setEnabledSearch(boolean enabled) {
        isEnable = enabled;
        setFocusable( enabled );
        setFocusableInTouchMode( enabled );
        setLongClickable( enabled );
        setOnClickListener( enabled ? null : this );
        //弹出软键盘
        if( enabled && requestFocus() ) {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    showSoftInput();
                }
            }, 100);
        }
    }

    /**
     * 该方法已弃用
     * 推荐使用： {@link SearchView#setEnabledSearch}
     * @param enabled   是否启用
     */
    @Deprecated
    @Override
    public void setEnabled(boolean enabled) {
        setEnabledSearch( enabled );
    }

    /**
     * 显示软键盘
     */
    public void showSoftInput() {
        SysUtil.showKeyboard( this );
    }

    /**
     * 搜索栏启用/禁用状态
     * @return  是否启用搜索
     */
    public boolean isEnabledSearch() {
        return isEnable;
    }

    /**
     * 该方法已弃用
     * 推荐使用： {@link SearchView#isEnabledSearch()}
     * @return  是否被启用
     */
    @Deprecated
    @Override
    public boolean isEnabled() {
        return isEnabledSearch();
    }

    /**
     * 搜索栏点击事件监听器
     * @param mOnClickListener  回调接口
     */
    public void setOnSearchClickListener(View.OnClickListener mOnClickListener) {
        this.mOnClickListener = mOnClickListener;
    }

    /**
     * 回车键点击事件监听器
     * @param mOnEnterListener  回调接口
     */
    public void setOnEnterListener(OnClickListener mOnEnterListener) {
        this.mOnEnterListener = mOnEnterListener;
    }

    @Override
    public void onClick(View v) {
        if( isEnabledSearch() || mOnClickListener == null ) return;
        mOnClickListener.onClick( v );
    }

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        int keyEnter = KeyEvent.KEYCODE_ENTER;
        if( event.getAction() != KeyEvent.ACTION_DOWN ) return false;
        //回车键按下时回调回车键点击事件监听器
        if( keyCode == keyEnter && mOnEnterListener != null ) mOnEnterListener.onClick( v );
        return false;
    }
}
